package guestbook.controlador;


import com.google.appengine.repackaged.org.json.JSONArray;
import com.google.appengine.repackaged.org.json.JSONException;
import com.google.appengine.repackaged.org.json.JSONObject;
import guestbook.persistencia.Saludo;
import guestbook.persistencia.Usuario;
import guestbook.persistencia.Voto;
import guestbook.service.SaludoService;
import guestbook.service.UsuarioService;
import guestbook.service.VotoService;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class VotoController {

    private VotoService votoService;
    private SaludoService greetingsService;
    private UsuarioService usuarioService;

    @Autowired
    @Required
    public void setVotoService(VotoService votoService) {
        this.votoService = votoService;
    }


    @Autowired
    @Required
    public void setGreetingsService(
            SaludoService greetingsService) {
        this.greetingsService = greetingsService;
    }

    @Autowired
    @Required
    public void setUsuarioService(UsuarioService usuarioService) {
        this.usuarioService = usuarioService;
    }

    
    @RequestMapping(value = "/votar")
    public @ResponseBody String votar(@RequestParam int voto, @RequestParam Long idMensaje) {
        Usuario u = usuarioService.getCurrentUser();
        if (u == null) {
            return null;
        } else {
            votoService.create(voto, idMensaje, u);
            return datosVoto(idMensaje).toString();
        }
        
    }


    @RequestMapping(value = "/mostrarDatosVotos")
    public @ResponseBody String mostrarDatosVotos(@RequestParam String mensajes) {
         System.out.println("mensajes="+mensajes);
        String salida = "[";
        try {
            JSONArray entradas = new JSONArray(mensajes);
            System.out.println(entradas.length());        
            for (int i= 0; i < entradas.length(); i++) {
                JSONObject entrada = entradas.optJSONObject(i);
                Long idMensaje = entrada.getLong("idMensaje");
                salida += datosVoto(idMensaje);
                if (i < entradas.length() -1) {
                    salida += ",";
                }
            }
        
        } catch (JSONException ex) {
            Logger.getLogger(VotoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        salida += "]";
        return salida;
    }




    private JSONObject datosVoto(Long idMensaje) {
        int numVotos = votoService.countVotos(idMensaje);

        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("idMensaje", idMensaje);
            jsonObject.put("votes", numVotos);
            if (numVotos == 0) {

                jsonObject.put("avg", "No votes");

            } else {                
                jsonObject.put("avg", votoService.avgVotos(idMensaje));                

            }
        } catch (JSONException ex) {
            Logger.getLogger(VotoController.class.getName()).log(Level.SEVERE, null, ex);
        }
        return jsonObject;
    }

    @RequestMapping(method=RequestMethod.GET, value="/getVoto", headers="Accept=application/json")
    public @ResponseBody String getVoto(@RequestParam Long idSaludo) {
        JSONObject jsonObject =  new JSONObject();
        Usuario u = usuarioService.getCurrentUser();
        Saludo saludo = greetingsService.getSaludo(idSaludo);
        Voto voto = null;
        List<Voto> votos = null;
        if (saludo != null && u != null) {
            votos = votoService.getVotos(u.getUsername(), saludo);
        }

        if (votos != null && !votos.isEmpty()) {            
            voto = votos.get(0);
            try {
                jsonObject.put("voto", voto.getVoto());
            } catch (JSONException ex) {
                Logger.getLogger(VotoController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
        
        System.out.println("AQUI VotoController getVoto="+jsonObject);

        return jsonObject.toString();
    }
}
